#include "CocosButton.h"

using namespace cocos2d;

//////////////////////////////////////////////////////////////////////////
//
// 虚函数
//
//////////////////////////////////////////////////////////////////////////

void CCocosButton::onReceiveNewTouch()
{
	// 获取到一个新的触摸信息
    
	if(TYPE_SCALE == m_type)
	{
		m_pSprNormal->setScale(m_scaleFactor);
	}
	else if(TYPE_REPLACE == m_type)
	{
		m_pSprNormal->setIsVisible(false);
		m_pSprReplace->setPosition(this->getPosition());
		m_pSprReplace->setIsVisible(true);
	}
	else if(TYPE_TRANSPARENT == m_type)
	{
		m_pSprNormal->setIsVisible(true);
	}
	else if(TYPE_CHANGE == m_type)
	{
		if(this->getIsVisible())
		{
			m_pSprNormal->setIsVisible(false);
			m_pSprReplace->setIsVisible(true);
			m_pSprReplace->setPosition(this->getPosition());
		}
		else
		{
			m_pSprNormal->setIsVisible(true);
			m_pSprReplace->setIsVisible(false);
			m_pSprReplace->setPosition(this->getPosition());
		}
	}
    
    m_bReceiveDown = true;
    
}

void CCocosButton::onCurTouchMoveOut()
{
	// 获取到当前触摸移除BUTTON区域
    
    m_bReceiveDown = false;
    
	loseFocus();
}

void CCocosButton::onCurTouchFinish()
{
	// 获取当前触摸取消
    
	loseFocus();
    
	if(NULL != m_pListener)
	{
		m_pListener->onReceiveMsg(m_id, EVENT_UP);
	}
    
    m_bReceiveDown = false;
}

//////////////////////////////////////////////////////////////////////////
//
// 私有函数
//
//////////////////////////////////////////////////////////////////////////


void CCocosButton::InitState(int id, CUIListener *pListerner, ButtonType type /* = TYPE_SCALE */, const char *szTexture1, const char *szTexture2, bool bUseFrame)
{
	CCocosUIBase::SetData(id, pListerner, true);
	m_type = type;
    
	if(bUseFrame)
	{
		if(NULL != szTexture1)
		{
			m_pSprNormal = CCSprite::spriteWithSpriteFrameName(szTexture1);
			addChild(m_pSprNormal);
		}
        
		if(NULL != szTexture2)
		{
			m_pSprReplace = CCSprite::spriteWithSpriteFrameName(szTexture2);
			addChild(m_pSprReplace);
		}
	}
	else
	{
		if(NULL != szTexture1)
		{
			m_pSprNormal = CCSprite::spriteWithFile(szTexture1);
			addChild(m_pSprNormal);
            
		}
        
		if(NULL != szTexture2)
		{
			m_pSprReplace = CCSprite::spriteWithFile(szTexture1);
			addChild(m_pSprReplace);
		}
	}
    
	if(type == TYPE_TRANSPARENT || type == TYPE_CALLSHOW)
	{
		m_pSprNormal->setIsVisible(false);
	}
	else if(type == TYPE_CHANGE)
	{
		if(NULL != m_pSprReplace)
		{
			m_pSprReplace->setIsVisible(false);
		}
	}
    
	if(NULL != m_pSprNormal || TYPE_NONE == m_type)
	{
		setContentSize(m_pSprNormal->getContentSize());
	}
    
    m_bReceiveDown = false;
}
//////////////////////////////////////////////////////////////////////////
//
// 静态函数
//
//////////////////////////////////////////////////////////////////////////

CCocosButton *CCocosButton::CreateButton(int id, CUIListener *pListener, ButtonType type /* = TYPE_SCALE */, bool bUseFrame /* = false */, 
										 const char *szTexture1 /* = NULL */, const char *szTexture2 /* = NULL */)
{	
	CCocosButton *pNewButton = CCocosButton::node();
	pNewButton->InitState(id, pListener, type, szTexture1, szTexture2, bUseFrame);
	return pNewButton;
}

void CCocosButton::ResetState()
{
	if(TYPE_SCALE == m_type)
	{
		m_pSprNormal->setScale(1.0f);
	}
	else if(TYPE_REPLACE == m_type)
	{
		this->setIsVisible(true);
		m_pSprReplace->setIsVisible(false);
	}
	else if(TYPE_TRANSPARENT == m_type)
	{
		m_pSprNormal->setIsVisible(false);
	}
    
	m_pCurTouch = NULL;
}

//////////////////////////////////////////////////////////////////////////
//
// 公有函数
//
//////////////////////////////////////////////////////////////////////////

CCocosButton::CCocosButton()
: m_pSprReplace(NULL)
, m_pSprNormal(NULL)
, m_scaleFactor(1.1f)
{
    
}

void CCocosButton::ChangeButton(bool bUseReplace /* = false */)
{
	if(bUseReplace)
	{
		m_pSprNormal->setIsVisible(false);
		m_pSprReplace->setIsVisible(true);
		m_pSprReplace->setPosition(this->getPosition());
	}
	else
	{
		m_pSprNormal->setIsVisible(true);
		m_pSprReplace->setIsVisible(false);
		m_pSprReplace->setPosition(this->getPosition());
	}
}